
class Solution {
public:
    bool st[21];//确定位数有没有用过
    int path[21];//存储路径
    int n ;
    int k;
    vector<vector<int>> res;
    void dfs(int u,int start)
    {
      if (n - start + 1 < k - u) {
        return;
    }
        if(u == k)
        {
            vector<int> r;
            for(int i = 0;i<k;++i)
            {
                r.push_back(path[i]);
            }
            res.push_back(r);
            //此时吧path[1]
        }

        for(int i = start;i <= n; ++i) // i的遍历只代表 输出数组以nums[i]作为开头 在这层循环里面 u永远是1 然后起到找到所有情况的作用 画个树就明白了
        {       //其实就是 u = 1是第一层 1-- 2-- 3-- 4-- ....u=2就进入下一层 12- 13- 14- 逐层细化 分解问题  dfs缩小范围 for确定都能遍历到
            if(!st[i] )
            {
                path[u] = i;
                st[i] = true;
                dfs(u+1,i+1);
                path[u] = 0;
                st[i] = false;
            }
        }
}
    vector<vector<int>> combine(int s, int d) {
            n  = s;
            k  = d;
            dfs(0,1);
            //差一步去重复
            return res;
    }
};
